import { orderAttrsMap } from "./map";

export const checkCalcExpressionValid = (string) => {
  // 剔除空白符
  string = string.replace(/\s/g, "");

  // 替换中文括号
  string = string.replace(/（/g, "(");
  string = string.replace(/）/g, ")");

  // 错误情况，空字符串
  if ("" === string) {
    return false;
  }

  // 错误情况，运算符连续
  if (/[\+\-\*\/×÷]{2,}/.test(string)) {
    return false;
  }

  // 空括号
  if (/\(\)/.test(string)) {
    return false;
  }

  //空中括号
  if (/\[\]/.test(string)) {
    return false;
  }

  //不要出现等于号
  if (/=/.test(string)) {
    return false;
  }

  // 错误情况，括号不配对
  var stack = [];
  for (var i = 0, item; i < string.length; i++) {
    item = string.charAt(i);
    if ("(" === item) {
      stack.push("(");
    } else if (")" === item) {
      if (stack.length > 0) {
        stack.pop();
      } else {
        return false;
      }
    }
  }
  if (0 !== stack.length) {
    return false;
  }

  // 错误情况，中括号不配对
  var stack2 = [];
  for (var i = 0, item; i < string.length; i++) {
    item = string.charAt(i);
    if ("[" === item) {
      stack2.push("[");
    } else if ("]" === item) {
      if (stack2.length > 0) {
        stack2.pop();
      } else {
        return false;
      }
    }
  }
  if (0 !== stack2.length) {
    return false;
  }

  // 错误情况，(后面是运算符
  if (/\([\+\-\*\/×÷]/.test(string)) {
    return false;
  }

  // 错误情况，)前面是运算符
  if (/[\+\-\*\/×÷]\)/.test(string)) {
    return false;
  }

  // 错误情况，[后面是运算符
  if (/\[[\+\-\*\/×÷]/.test(string)) {
    return false;
  }

  // 错误情况，]前面是运算符
  if (/[\+\-\*\/×÷]\]/.test(string)) {
    return false;
  }

  //错误情况，运算符号不能在首末位
  if (/^[\+\-\*\/×÷.]|[\+\-\*\/×÷.]$/.test(string)) {
    return false;
  }

  //错误情况，中括号结尾到下一个开始之间没有运算符
  if (/\]\[/.test(string)) {
    return false;
  }

  return true;
};

export const checkAttrsNameValid = (string) => {
  let attrsName = [...string.matchAll(/[\u4e00-\u9fa5]+/g)].map((e) => e[0]);
  let wrong = "";
  if (
    attrsName.some((attr) => {
      wrong = attr;
      return !Object.values(orderAttrsMap).includes(attr);
    })
  )
    return [false, wrong];
  return [true, ""];
};
